package com.xxxtea.controller;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xxxtea.common.Result;
import com.xxxtea.common.UserContext;
import com.xxxtea.dto.Location;
import com.xxxtea.dto.LoginRequest;
import com.xxxtea.dto.PageQuery;
import com.xxxtea.entity.Merchant;
import com.xxxtea.entity.User;
import com.xxxtea.security.AuthManager;
import com.xxxtea.security.SecurityUtils;
import com.xxxtea.service.MerchantService;
import com.xxxtea.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * 用户控制器
 *
 * 提供用户的完整管理功能，包括：
 * - 用户注册、登录、注销
 * - 用户信息增删改查
 * - 用户分页与列表查询
 * - 用户定位信息设置
 * - 商家注册自动创建商家信息
 *
 * 使用Swagger注解进行API文档生成
 * 使用Lombok注解简化代码
 *
 * @author badman
 * @since 1.0.0
 */
@Slf4j
@Api("用户接口")
@RestController
@RequestMapping("/user")
public class UserController {
	/**
	 * 用户服务
	 */
	@Resource
	private UserService userService;
	
	/**
	 * 认证管理器
	 */
	@Resource
	private AuthManager authManager;
	
	/**
	 * 商家服务
	 */
	@Autowired
	private MerchantService merchantService;

	/**
	 * 设置用户定位信息
	 *
	 * @param location 经纬度字符串
	 * @return 操作结果
	 */
	@ApiOperation("设置用户定位信息")
	@PostMapping("/setLocation")
	public Result<Void> setLocation(String location) {
		User user = UserContext.getUser();
		user.setLocation(Location.of(location));
		userService.updateById(user);
		return Result.success();
	}

	/**
	 * 获取当前登录用户信息
	 *
	 * @return 当前用户信息
	 */
	@ApiOperation("获取登录用户信息")
	@GetMapping("/current")
	public Result<User> current() {
		User user = UserContext.getUser();
		return Result.success(user);
	}

	/**
	 * 用户登录
	 *
	 * @param loginRequest 登录请求参数
	 * @return 登录用户信息
	 */
	@ApiOperation("用户登录")
	@PostMapping("/login")
	public Result<User> login(@RequestBody LoginRequest loginRequest) {
		Assert.notBlank(loginRequest.getUsername(), "账号不能为空");
		Assert.notBlank(loginRequest.getPassword(), "密码不能为空");
		loginRequest.setPassword(SecurityUtils.encipher(loginRequest.getPassword()));
		LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(BeanUtil.toBean(loginRequest, User.class));
		User user = userService.getOne(wrapper);
		if (user == null) {
			return Result.error("登录失败!账号或密码错误!");
		}
		if (user.getStatus() == User.Status.DISABLE) {
			return Result.error("账号已被锁定!");
		}
		String token = authManager.add(user);
		log.info("用户[{}]登录成功, token:[{}]", user.getId(), token);
		return Result.success(user);
	}

	/**
	 * 用户注销
	 *
	 * @return 操作结果
	 */
	@ApiOperation("用户注销")
	@PostMapping("/logout")
	public Result<String> logout() {
		authManager.remove(UserContext.getUser());
		return Result.success();
	}

	/**
	 * 用户注册
	 * 注册商家用户时自动创建商家信息
	 *
	 * @param user 用户信息
	 * @return 操作结果
	 */
	@ApiOperation("用户注册")
	@PostMapping("/register")
	public Result<String> register(@RequestBody User user) {
		if (userService.lambdaQuery().eq(User::getUsername, user.getUsername()).exists()) {
			return Result.error("账号已存在");
		}
		// 加密进行存储
		user.setPassword(SecurityUtils.encipher(user.getPassword()));
		userService.save(user);
		if (user.getRole() == User.Role.MERCHANT) {
			Merchant merchant = new Merchant();
			merchant.setUserId(user.getId());
			merchant.setName("商家" + IdUtil.fastSimpleUUID().substring(0, 8));
			merchant.setAddress("");
			merchant.setDeliveryTime("");
			merchant.setAnnouncement("");
			merchant.setCreateTime(new Date());
			merchantService.save(merchant);
		}
		return Result.success("添加失败!");
	}

	/**
	 * 新增用户
	 *
	 * @param user 用户信息
	 * @return 操作结果
	 */
	@ApiOperation("新增用户")
	@PostMapping
	public Result<String> save(@RequestBody User user) {
		if (userService.save(user)) {
			return Result.success();
		}
		return Result.error("添加失败!");
	}

	/**
	 * 删除用户
	 *
	 * @param id 用户ID
	 * @return 操作结果
	 */
	@ApiOperation("删除用户")
	@DeleteMapping("/{id}")
	public Result<String> delete(@PathVariable String id) {
		if (userService.removeById(id)) {
			return Result.success();
		}
		return Result.error("删除失败!");
	}

	/**
	 * 更新用户
	 *
	 * @param user 用户信息
	 * @return 操作结果
	 */
	@ApiOperation("更新用户")
	@PutMapping
	public Result<String> update(@RequestBody User user) {
		user.setPassword(SecurityUtils.encipher(user.getPassword()));
		if (userService.updateById(user)) {
			return Result.success();
		}
		return Result.error("更新失败!");
	}

	/**
	 * 获取单个用户
	 *
	 * @param id 用户ID
	 * @return 用户信息
	 */
	@ApiOperation("获取单个用户")
	@GetMapping("/{id}")
	public Result<User> getOne(@PathVariable String id) {
		return Result.success(userService.getById(id));
	}

	/**
	 * 获取用户列表
	 *
	 * @return 用户列表
	 */
	@ApiOperation("获取用户列表")
	@GetMapping("/list")
	public Result<List<User>> list() {
		return Result.success(userService.list());
	}

	/**
	 * 分页查询用户
	 *
	 * @param request 分页查询条件
	 * @return 分页用户列表
	 */
	@ApiOperation("分页查询用户")
	@PostMapping("/page")
	public Result<Page<User>> page(@RequestBody PageQuery<User> request) {
		LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(request.getParam());
		wrapper.orderByDesc(User::getId);
		Page<User> pageResult = userService.page(request.toPage(), wrapper);
		return Result.success(pageResult);
	}
}
